home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1993-08-19 | 14.5 KB | 548 lines |
- ' *****************************************
- ' * *
- ' * Strike Commander V1.0 *
- ' * Written by Chris Hodges *
- ' * Graphics by Peter Hodges *
- ' * Additional ideas by Thomas B�ttner *
- ' * *
- ' *****************************************
- '
- Dim SC(1),X(1),Y(1),M(1),I(1),SX(1),SY(1),ACC(1),SH(1),RX(39),RY(39)
- Dim COI(1),COMP(1)
- Dim T$(33)
- 'RIPGRAPHICS
- Do
- Gosub TITLE
- Load "StrikeCommander.sam",5
- ACCL=1 : COMP(0)=1 : COMP(1)=0
- Gosub RAWINIT
- Gosub MAIN
- Erase 5
- Loop
- End
- TITLE:
- Hide
- Track Load "StrikeCommander.mus",3
- Track Loop On : Track Play
- Unpack 10 To 0 : Screen Hide
- Get Block 1,48,0,224,80
- Screen Open 1,320,256,4096,0
- Curs Off : Flash Off : Paper 0 : Pen 1 : Cls
- Get Palette 0
- For A=0 To 127
- Screen Copy 0,0,A*2,320,A*2+1 To 1,0,A*2
- Screen Copy 0,0,255-A*2,320,256-A*2 To 1,0,255-A*2
- If A and 1 Then Wait Vbl
- Next
- Screen Open 0,320,80,64,0 : Screen Hide
- Curs Off : Flash Off : Paper 0 : Pen 1 : Cls
- Ink 1,0
- Gr Writing 0
- T$(0)="" : T$(1)="" : T$(2)="" : T$(3)=""
- T$(4)="" : T$(5)=""
- T$(6)="Strike Commander" : T$(7)="** 68000 Version **"
- T$(8)="Written by Chris Hodges" : T$(9)=""
- T$(10)="Graphics by Peter Hodges" : T$(11)=""
- T$(12)="Additional ideas and help by" : T$(13)="Thomas B�ttner"
- T$(14)="" : T$(15)="Inspired by the game"
- T$(16)="Biplanes by Peter Mason" : T$(17)=""
- T$(18)="" : T$(19)="Control:"
- T$(20)="Up Accelerate " : T$(21)="Left Clockwise "
- T$(22)="Right Anti-clockwise" : T$(23)="Down Brake "
- T$(24)="" : T$(25)="To activate second player"
- T$(26)="press the button on joystick" : T$(27)="in the mouseport."
- T$(28)="" : T$(29)="Enjoy the game!" : T$(30)=""
- T$(31)="" : T$(32)="" : T$(33)=""
- O=30 : P=7
- Repeat
- Put Block 1
- For A=0 To 10
- X=160-Len(T$((A+O) mod 34))*4
- Y=A*8+P-2
- T$=T$((A+O) mod 34)
- Ink 0 : Text X+1,Y+1,T$
- Ink 63-Max(Y-60,0)/2-Max(20-Y,0)/2 : Text X,Y,T$
- Next
- While Timer<4 : Wait Vbl : Wend
- Wait Vbl
- While Peek($DFF006)<Y Hard(80) : Wend
- Timer=0
- Screen Copy 0,48,0,272,80 To 1,48,0
- Dec P : If P<0 Then Add O,1,0 To 33 : P=7
- I$=Inkey$
- Until(I$<>"") or(Fire(1) or Fire(0))
- Cls 0
- Del Block 1
- Screen 1
- For A=0 To 127
- Screen Copy 0,0,0,320,1 To 1,0,A*2
- Screen Copy 0,0,0,320,1 To 1,0,255-A*2
- If A and 1 Then Wait Vbl
- Next
- Track Stop
- Screen Close 0
- Screen Close 1
- Erase 3
- If Asc(I$)=27 Then End
- Return
- MAIN:
- Gosub INIT
- Do
- If Fire(0) Then COMP(0)=0
- Bob Draw
- Screen Swap
- Wait Vbl : T=Timer
- Bob Clear
- For TI=1 To Min(T,8)
- Gosub EXTRAS
- For A=0 To 1
- If I(A)>-1 Then Gosub STEERING Else Gosub EXLOSI
- SAMSPEED[1+A,5000+Abs(M(A))*70]
- Next
- Next
- Timer=0
- If GAMEOVER Then Gosub GAMEOVER Else Gosub INGAME
- I$=Upper$(Inkey$)
- If I$="P" Then Gosub PAUSE
- Exit If Asc(I$)=27
- Loop
- Sam Stop
- Fade 2 : Wait 33 : Amal Off : Bob Off
- Screen 1 : Rainbow Del : View
- Fade 1 : Wait 17
- Screen Close 0
- Screen Close 1
- Return
- EXTRAS:
- If LEMX>-1 Then Gosub LEMMING
- If Rnd(2000)=0 and LEMX=-1 Then LEMX=0 : LEMY=168 : LEMI=0 : Sam Play K,6 : Gosub CHCH
- If SMILY>-1 Then Gosub SMILY
- If Rnd(2000)=0 and SMILY=-1 Then Inc SMILY : Sam Play K,7 : Gosub CHCH
- If UFOI>-1 Then Gosub UFO
- If Rnd(1000)=0 and UFOI=-1 Then Inc UFOI : If GAMEOVER=0 Then Sam Play 8,1 : Gosub CHCH
- If TSX<>0 Then Gosub TURM
- Return
- CHCH:
- If UFOI>-1 Then Sam Loop On : Sam Loop On 4 : K=4 Else Sam Loop On 8 : K=12-K
- If GAMEOVER>0 and UFOI>-1 Then Sam Loop On 8
- Return
- PAUSE:
- TT=Timer : Sam Stop 11
- Screen 1 : Home : Centre "GAME PAUSED!"
- While(Inkey$="") and Fire(0)=0 and Fire(1)=0
- Bob Draw
- Screen Swap
- Multi Wait
- Bob Clear
- Wend
- Centre " " : Screen 0
- If GAMEOVER Then Timer=TT : Return
- Sam Play 1,2,5000
- Sam Play 2,2,5000
- If UFOI>-1 and UFOI<4 Then Sam Play 8,1 : Gosub CHCH
- Timer=TT
- Return
- GAMEOVER:
- Inc GAMEOVER
- If(Fire(0) or Fire(1)) and(GAMEOVER>50) Then GAMEOVER=Max(GAMEOVER,1000)
- If GAMEOVER=19 Then Bob Off 12 : Bob Off 13
- If GAMEOVER=1000 Then Fade 2
- If GAMEOVER=1062 Then Screen 1 : Fade 1 : Screen 0
- If GAMEOVER=1078 Then Gosub INIT
- Return
- SMILY:
- Inc SMILY : If SMILY>38 Then SMILY=-1 : Bob Off 6
- Bob 6,175,125,74-Abs(SMILY/3-6)
- Return
- LEMMING:
- Inc LEMX : Add LEMI,1,0 To 20
- If LEMX>637 Then LEMX=-1 : Bob Off 7 : Return
- While Point(LEMX/2,LEMY)<>7 : Dec LEMY : Wend
- While Point(LEMX/2,LEMY+1)=7 : Inc LEMY : Wend
- Bob 7,LEMX/2,LEMY,LEMI/3+80
- Return
- UFO:
- If UFOI>3 Then Goto UFOEXPLO
- Inc UFOY
- Add UFOX,Rnd(2)-1
- Add UFOI,1,0 To 3
- If UFOY>400 Then Add UFOX,Sgn(UFOX-160)*8
- If UFOX<-8 or UFOX>324
- UFOI=-1 : UFOX=160 : UFOY=-8 : Sam Stop 8
- Bob Off 8
- Return
- End If
- Bob 8,UFOX,UFOY/3,UFOI+64
- Return
- UFOEXPLO:
- If UFOI=25 Then UFOI=-1 : UFOX=160 : UFOY=-8 : Bob Off 8 : Return
- Inc UFOI
- Bob 8,UFOX,UFOY/3,UFOI+37
- Return
- TURM:
- Add TX,TSX : Add TY,TSY
- If TY>22100 Then TY=22100 : TSY=0 : TSX=0
- Add TSY,8
- X=TX/100 : Y=TY/100
- If OTX<>X or OTY<>Y Then Bob 9,X,Y, : OTX=X : OTY=Y
- Return
- INGAME:
- Gosub KOLLISION
- If SC(0)=20 or SC(1)=20
- Inc GAMEOVER : Sam Stop 11 : Screen Offset 0,0,15
- Screen 1 : Home : Centre "GAME OVER!" : Screen 0
- End If
- Return
- RAWINIT:
- Hide
- Randomize Timer
- Wait Vbl : Timer=0
- Degree
- For A=0 To 39
- RX(A)=Cos(A*9)*100
- RY(A)=Sin(A*9)*100
- Next
- Sam Bank 5
- Volume 15,63
- Screen Open 1,320,17,2,0
- Curs Off : Paper 0 : Pen 1 : Cls
- Palette 0,0
- Screen Display 1,128,281,320,8
- Screen Open 0,320,256,16,0
- Curs Off : Flash Off : Paper 0 : Pen 1
- For A=0 To 31 : Colour A,0 : Next
- Screen Display 0,128,40,320,240
- Screen Offset 0,0,15
- Double Buffer
- Autoback 0
- Bob Update Off
- Return
- INIT:
- Rainbow Del : View
- For A=1 To 28
- Trap Bob A,-50,-50,
- Next
- Bob Draw : Screen Swap : Wait Vbl : Bob Clear
- Bob Draw : Screen Swap : Wait Vbl : Bob Clear
- Gosub INITSHOTS
- Cls 7
- 'Make Mask
- Paste Bob 0,100,100
- Paste Bob 0,250,101
- Set Rainbow 0,7,256,"","",""
- On Rnd(2)+1 Gosub NIGHT,DAYDAWN,DAYLIGHT
- Screen Copy Logic(0) To Physic(0)
- Bob 9,160,221,104 : TX=16000 : TY=22100 : TSX=0 : TSY=0
- BETTERRAIN[0,255]
- Screen 1 : Cls : Fade 1,0,$FFF : Screen 0 : Wait 16
- Rainbow 0,0,38,256
- For A=0 To 1
- I(A)=A*20 : X(A)=A*31900 : Y(A)=24800 : COI(A)=I(A)
- SX(A)=0 : SY(A)=0 : M(A)=0 : ACC(A)=0
- SC(A)=0
- Next
- Gosub UPSCORE
- Fade 2 To -1
- Sam Loop On
- Sam Play 1,2,5000
- Sam Play 2,2,5000
- Sam Loop On 4
- Timer=0 : GAMEOVER=0
- LEMX=-1 : SMILY=-1
- UFOI=-1 : UFOX=160 : UFOY=-8 : K=8
- Return
- KOLLISION:
- If I(0)>-1
- If Bob Col(10,8 To 23)
- If Col(9)
- TSX=SX(0)/5 : TSY=-50+SY(0)/10
- I(0)=-1
- End If
- If Col(11) or(Col(8) and(UFOI>-1 and UFOI<4))
- I(0)=-1 : SC(1)=SC(1)+Col(11)
- End If
- If Col(22) or Col(23)
- If Rnd(3)>1
- Sam Play K,3 : Gosub CHCH
- Else
- I(0)=-1
- End If
- End If
- End If
- End If
- If I(1)>-1
- If Bob Col(11,8 To 23)
- If Col(9)
- TSX=SX(1)/5 : TSY=-50+SY(1)/10
- I(1)=-1
- End If
- If Col(10) or(Col(8) and(UFOI>-1 and UFOI<4))
- I(1)=-1 : SC(0)=SC(0)+Col(10)
- End If
- If Col(20) or Col(21)
- If Rnd(3)>1
- Sam Play K,3 : Gosub CHCH
- Else
- I(1)=-1
- End If
- End If
- End If
- End If
- If UFOI>-1
- If Bob Col(8,20 To 23) and(UFOI>-1 and UFOI<4)
- UFOI=4
- Sam Play 4,4 : Sam Stop 8 : Gosub CHCH
- If Col(20) or Col(21)
- Inc SC(0)
- End If
- If Col(22) or Col(23)
- Inc SC(1)
- End If
- Gosub UPSCORE
- End If
- End If
- For A=0 To 3
- If Bob Col(20+A,8 To 12) and Amreg(A,4)>1 Then Amreg(A,4)=1
- Next
- Return
- UPSCORE:
- Screen 1
- If SC(0)<10 Then A$="0" Else A$=""
- A$=A$+Mid$(Str$(SC(0)),2)+At(38,0)
- Home
- If SC(1)<10 Then A$=A$+"0"
- A$=A$+Mid$(Str$(SC(1)),2)
- Print A$;
- Screen 0
- Return
- INITSHOTS:
- A$="J B; "
- A$=A$+"A: L X=R0/100; L Y=R1/100; L R0=R0+R2; L R1=R1+R3; L R5=R5+1; P; "
- A$=A$+"I R0<0 J E; I R0>31900 J D; I R1<0 J B; "
- A$=A$+"F: I R1>24800 J B; I R4=1 J B; I R5>50 J B; J A; "
- A$=A$+"B: L R0=-90000; L R1=-90000; L X=-10; L Y=-10; L R4=1; L R5=0; C: P; I R4=0 J A; J C; "
- A$=A$+"D: L R0=R0-32000; J F;"
- A$=A$+"E: L R0=R0+32000; J F;"
- For A=0 To 3
- Bob 20+A,-10,-10,98+A/2
- Channel A To Bob 20+A
- Amal A,A$
- Next
- Amal On
- Return
- DAYDAWN:
- Paste Bob 240,132,102
- C0=0 : C1=0
- For A=0 To 165
- Rain(0,A)=C0*$100+C1*$10
- If A mod 8=0 and C0=15 Then Inc C1
- If A mod 8=0 Then C0=Min(C0+1,15)
- Next
- For A=0 To 89
- Rain(0,A+166)=Min(4+A/5,15)+Max(A/7-8,0)*$10
- Next
- Return
- DAYLIGHT:
- C0=0 : C1=8
- Ink 8
- Circle 100,50,8
- Paint 100,50,1
- For A=0 To 165
- Rain(0,A)=C0*$100+C1*$10+15
- If A mod 12=0 and C1=15 Then Inc C0
- If A mod 8=0 Then C1=Min(C1+1,15)
- Next
- For A=0 To 89
- Rain(0,A+166)=Min(4+A/4,15)+Max(A/8-8,0)*$10
- Next
- Return
- NIGHT:
- For A=0 To 99
- X=Rnd(320)
- Y=Rnd(150)
- If Point(X,Y)=7 Then Plot X,Y,Rnd(3)+1
- Next
- Paste Bob 216,64,63
- C0=4 : C2=0
- For A=0 To 165
- Rain(0,A)=C0*$100+C2
- If A mod 14=0 and C0=0 Then Inc C2
- If A mod 8=0 Then C0=Max(C0-1,0)
- Next
- For A=0 To 89
- Rain(0,A+166)=Min(4+A/10,15)+Max(A/7-8,0)*$10
- Next
- Return
- EXLOSI:
- If GAMEOVER
- I(A)=(I Bob(10+A)-A*20-1)*2
- If Y(A)>24900 and SY(A)>0 : SY(A)=-Max((SY(A)*3)/2,-300) : End If
- Add X(A),SX(A),0 To 31900
- Return
- End If
- If I(A)=-1 Then Sam Play K,4 : M(A)=0 : Inc SC(1-A) : Gosub UPSCORE : Gosub CHCH
- If I(A)>-13 Then Screen Offset 0,0,10+Rnd(4) Else Screen Offset 0,0,15
- If I(A)<-10 Then Bob Off 10+A Else Bob 10+A,X(A)/100,Y(A)/100,
- If I(A)<-21 Then Bob Off 12+A Else Bob 12+A,X(A)/100,Y(A)/100,41+Abs(I(A))
- Dec I(A)
- SX(A)=SX(A)-SX(A)/8
- SY(A)=SY(A)-SY(A)/8+20
- Add X(A),SX(A),0 To 31900
- Add Y(A),SY(A)
- If Y(A)>24900 and SY(A)>0 Then SY(A)=-SY(A)
- If I(A)<-40
- I(A)=A*20 : X(A)=A*31900 : Y(A)=24800
- SX(A)=0 : SY(A)=0 : M(A)=0 : ACC(A)=0 : COI(A)=I(A)
- End If
- Return
- STEERING:
- Bob 10+A,X(A)/100,Y(A)/100,1+A*20+I(A)/2
- If COMP(A)=1 Then Goto COMPMOVE
- If Jleft(A) Then Add I(A),-1,0 To 39
- If Jright(A) Then Add I(A),1,0 To 39
- If Jdown(A) and M(A)>0 Then M(A)=Max(M(A)-3,0) : ACC(A)=0
- If Y(A)=24800 Then Gosub STAR Else Gosub FLIGHT
- Add X(A),SX(A),0 To 31900
- Add Y(A),SY(A)
- If Y(A)<1500 Then Y(A)=1500 : M(A)=0 : SY(A)=0
- If Y(A)>24900 Then I(A)=-1
- Return
- COMPMOVE:
- If Y(A)=24800 Then Gosub COMPSTAR Else Gosub COMPFLIGHT
- Add X(A),SX(A),0 To 31900
- Add Y(A),SY(A)
- If Y(A)<1500 Then Y(A)=1500 : M(A)=0 : SY(A)=0
- If Y(A)>24900 Then I(A)=-1
- If I(A)<0 Then Return
- If A=0 and COI(A)>9 and COI(A)<20 and I(A)<10 Then COI(A)=20-COI(A)
- If A=1 and I(A)>9 and I(A)<20 and COI(A)<10 Then COI(A)=20-COI(A)
- If A=0 and COI(A)>19 and COI(A)<30 and I(A)>29 Then COI(A)=40-(COI(A)-20)
- If A=1 and I(A)>19 and I(A)<30 and COI(A)>29 Then COI(A)=40-(COI(A)-20)
- S=COI(A)-I(A)
- If Abs(S)<39-Abs(S)
- Add I(A),Sgn(S),0 To 39
- Else
- Add I(A),-Sgn(S),0 To 39
- End If
- Return
- COMPSTAR:
- If M(A)<100 and(M(1-A)>0 or M(A)>0) Then Inc M(A)
- If M(A)>60 Then COI(A)=36+Rnd(2)
- SX=(M(A)*RX(I(A)))/32
- SY=(M(A)*RY(I(A)))/32
- Add SX(A),Max(Min(SX-SX(A),50),-50)
- Add SY(A),Max(Min(SY-SY(A),50),-50)
- Return
- COMPFLIGHT:
- If M(A)>50 and M(A)<100 Then Inc M(A)
- D=M(A)*20
- If Abs(X(A)-X(1-A))+Abs(Y(A)-Y(1-A))<D*6 Then Add COI(A),Sgn(Y(A)-Y(1-A)),0 To 39
- If Rnd(50)=0 and I(A)=COI(A) Then COI(A)=Rnd(39)
- If Y(A)>22500-D Then COI(A)=38-(Y(A)-23000+D)/1000
- If Y(A)<4000+D Then COI(A)=8-((Y(A)-D)/500)
- DT=Abs(X(A)-TX)+Abs(Y(A)-TY)
- If DT<5000+D Then COI(A)=34
- SX=(M(A)*RX(I(A)))/32
- SY=(M(A)*RY(I(A)))/32
- For S=(1-A)*2 To(1-A)*2+1
- DT=Abs(Amreg(S,0)-X(A))+Abs(Amreg(S,1)-Y(A))
- If DT<3000 and I(A)=COI(A) Then COI(A)=Rnd(39)
- Next
- If M(A)>50
- If M(A)<70 : Add Y(A),70-M(A) : End If
- If M(A)<60 : COI(A)=36+Rnd(3) : End If
- Add SX(A),Max(Min(SX-SX(A),50),-50)
- Add SY(A),Max(Min(SY-SY(A),50),-50)
- Else
- COI(A)=10
- SY(A)=Min(SY(A)+4,300) : SY=SY(A) : Dec M(A)
- If SY>250 and I(A)>7 and I(A)<13
- M(A)=Max(M(A),51)
- End If
- End If
- If Abs(X(A)-X(1-A))+Abs(Y(A)-Y(1-A))<D*6 Then Add COI(A),A*2-1,0 To 39
- S=Sgn(RY(I(A))/85)
- If M(A)>30 Then M(A)=Max(Min(M(A)+S*3-Abs(S),150),0)
- If Rnd(30)=0 and(Amreg(A*2,4)=1 or Amreg(A*2+1,4)=1)
- Sam Play K,5,8000 : Gosub CHCH
- If Amreg(A*2,4)=1 : S=A*2 : Else S=A*2+1 : End If
- Amreg(S,0)=X(A)+SX(A)*2
- Amreg(S,1)=Y(A)+SY(A)*2
- Amreg(S,2)=RX(I(A))*6
- Amreg(S,3)=RY(I(A))*6
- Amreg(S,4)=0
- End If
- Return
- STAR:
- If(Jup(A) or ACC(A)) and M(A)<100 Then Inc M(A) : If ACCL Then ACC(A)=1
- SX=(M(A)*RX(I(A)))/32
- SY=(M(A)*RY(I(A)))/32
- Add SX(A),Max(Min(SX-SX(A),50),-50)
- Add SY(A),Max(Min(SY-SY(A),50),-50)
- If I(A)<>A*20 and M(A)=0 Then I(A)=-1
- Return
- FLIGHT:
- If(Jup(A) or ACC(A)) and M(A)>50 and M(A)<100 Then Inc M(A) : If ACCL Then ACC(A)=1
- SX=(M(A)*RX(I(A)))/32
- SY=(M(A)*RY(I(A)))/32
- If M(A)>50
- If M(A)<70 : Add Y(A),70-M(A) : End If
- Add SX(A),Max(Min(SX-SX(A),50),-50)
- Add SY(A),Max(Min(SY-SY(A),50),-50)
- Else
- SY(A)=Min(SY(A)+4,300) : SY=SY(A) : Dec M(A)
- If SY>250 and I(A)>7 and I(A)<13
- M(A)=Max(M(A),51)
- End If
- End If
- S=Sgn(RY(I(A))/85)
- If M(A)>30 Then M(A)=Max(Min(M(A)+S*3-Abs(S),150),0)
- If Fire(A)=0 Then SH(A)=0
- If Fire(A) and SH(A)=0 and(Amreg(A*2,4)=1 or Amreg(A*2+1,4)=1)
- SH(A)=1 : Sam Play K,5,8000 : Gosub CHCH
- If Amreg(A*2,4)=1 : S=A*2 : Else S=A*2+1 : End If
- Amreg(S,0)=X(A)+SX(A)*2
- Amreg(S,1)=Y(A)+SY(A)*2
- Amreg(S,2)=RX(I(A))*6
- Amreg(S,3)=RY(I(A))*6
- Amreg(S,4)=0
- End If
- Return
- Procedure RIPGRAPHICS
- Load Iff "dh2:amosgfx/StrikeCommanderData16.iff",0
- Colour 7,0
- For A=0 To 74
- Get Sprite A+1,(A mod 20)*16,(A/20)*16 To(A mod 20)*16+16,(A/20)*16+16
- Hot Spot A+1,7,7
- Next
- For A=0 To 7
- Get Sprite 80+A,A*8,112 To A*8+7,122
- Hot Spot 80+A,2,9
- Next
- Get Sprite 98,224,48 To 232,50
- Get Sprite 99,232,48 To 240,50
- Get Sprite 100,0,152 To 320,250
- Get Sprite 101,0,104 To 320,110
- Get Sprite 102,0,64 To 64,93
- Get Sprite 104,128,64 To 158,98
- Hot Spot 104,19,0
- End Proc
- Procedure BETTERRAIN[R,L]
- T=1 : AF=Rain(R,0)
- For A=2 To L-1
- Inc T
- If(Rain(R,A)<>AF)
- AF=Rain(R,A)
- If T>3
- Rain(R,A-2)=AF
- End If
- T=0
- End If
- Next
- End Proc
- Procedure SAMSPEED[KANAL,FREQ]
- RATE=3579545/FREQ
- For A=0 To 3
- If Btst(A,KANAL) Then Doke $DFF0A6+A*16,RATE
- Next
- End Proc